//
// Created by Administrator on 2023/11/23.
//
#include "bits/stdc++.h"

using namespace std;

const int N = 510, INF = 0x3f3f3f3f;

int n, m;

int dist[N];
bool st[N];
int g[N][N];

int prim() {
    int sum = 0;
    //遍历每个点
    for (int i = 0; i < n; ++i) {
        int t = -1;//标记dist中最小元素，同时，第一次遍历是设成1，即第一个点
        for (int j = 1; j <= n; ++j) {
            //t=-1是第一次找点的情况，||后是最小点
            if (!st[j] && (t == -1 || dist[t] < dist[j]))
                t = j;
        }
        //如果非第一次且是无穷大，证明不连通
        if (i != 0 && dist[t] == INF) return INF;
        st[t] = true;

        //非第一个点，那么加上这个距离【认为第一个点的距离为0】
        if(i!=0)sum += dist[t];
        //更新dist数组
        for (int j = 1; j <= n; ++j) {
            dist[j] = min(dist[j], g[t][j]);
        }
    }

    return sum;
}

int main() {
    memset(dist, INF, sizeof dist);
    memset(g, INF, sizeof g);
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v, w;
        cin >> u >> v >> w;
        g[u][v] = w;
    }
    int res = prim();
    if (res != INF) cout << res;
    else cout << "impossible";

}